using System;
using System.Collections.Generic;
using System.Text;

namespace Skeletons
{
    public class DBTableScheletro
    {
        private long m_lId = -1;
        private string m_strNome = "";
        private string m_strDescrizione = "";
        private DateTime m_rDataCreazione = new DateTime();
        private DateTime m_rDataAggiornamento = new DateTime();
        private long m_lIdCategoria = 0;
        private long m_lIdPersonaggio = 0;
        private string m_strXML = "";

        private DB m_rDB;

        public DBTableScheletro(DB p_rDB)
        {
            m_rDB = p_rDB;
        }

        public DBTableScheletro(DB p_rDB, long p_lID)
        {
            m_rDB = p_rDB;
            load(p_lID);
        }

        public long ID
        {
            get { return m_lId; }
            protected set { m_lId = value; }
        }

        public string Nome
        {
            get { return m_strNome; }
            set { m_strNome = value; }
        }

        public string Descrizione
        {
            get { return m_strDescrizione; }
            set { m_strDescrizione = value; }
        }

        public string DataCreazione
        {
            get { return m_rDataCreazione.Day.ToString() + "/" + m_rDataCreazione.Month.ToString() + "/" + m_rDataCreazione.Year.ToString(); }
            set { m_rDataCreazione = DateTime.Parse(value); }
        }

        public string DataAggiornamento
        {
            get { return m_rDataAggiornamento.Day.ToString() + "/" + m_rDataAggiornamento.Month.ToString() + "/" + m_rDataAggiornamento.Year.ToString(); }
            set { m_rDataAggiornamento = DateTime.Parse(value); }
        }

        public long IDCategoria
        {
            get { return m_lIdCategoria; }
            set { m_lIdCategoria = value; }
        }

        public long IDPersonaggio
        {
            get { return m_lIdPersonaggio; }
            set { m_lIdPersonaggio = value; }
        }

        public string XML
        {
            get { return m_strXML; }
            set { m_strXML = value; }
        }

        private bool chkNameInDB()
        {
            string strQuery = "SELECT M_ID FROM Movimento WHERE M_Name = '" + Nome + "'";

            if (m_rDB.isConnected())
            {
                if (m_rDB.recordExists("Movimento", "M_Nome", Nome))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }

            return false;
        }

        private bool update()
        {
            string strQuery;

            strQuery = "UPDATE Movimento SET ";
            strQuery += "M_Nome = '" + Nome + "', ";
            strQuery += "M_Descrizione = '" + Descrizione + "', ";
            strQuery += "M_DataCreazione = '" + DataCreazione + "', ";
            strQuery += "M_DataAggiornamento = '" + DataAggiornamento + "', ";
            strQuery += "M_IDCategoria = " + IDCategoria + ", ";
            strQuery += "M_IDPersonaggio = " + IDPersonaggio + ", ";
            strQuery += "M_XML = '" + XML + "' ";
            strQuery += "WHERE M_ID = " + m_lId;

            if (m_rDB.save(strQuery))
                return true;
            else
                return false;
        }

        private bool insert()
        {
            string strQuery;

            strQuery = "INSERT INTO Movimento (M_Nome, M_Descrizione, M_DataCreazione, M_DataAggiornamento, M_IDCategoria, M_IDPersonaggio, M_XML) VALUES ";
            strQuery += "(";
            strQuery += "'" + Nome + "', ";
            strQuery += "'" + Descrizione + "', ";
            strQuery += "'" + DataCreazione + "', ";
            strQuery += "'" + DataAggiornamento + "', ";
            strQuery += IDCategoria.ToString() + ", ";
            strQuery += IDPersonaggio.ToString() + ", ";
            strQuery += "'" + XML + "'";
            strQuery += ")";

            Console.WriteLine(strQuery);

            if (m_rDB.save(strQuery))
            {
                ID = m_rDB.getLastAutoincrementedID();
                return true;
            }
            else
            {
                return false;
            }
        }

        public bool save()
        {
            if (m_rDB.isConnected())
            {
                bool res = true;

                //if (m_rDB.recordExists("Movimento", "M_ID", ID))
                if (chkNameInDB())
                    res = update();
                else
                    res = insert();

                return res;
            }
            else
            {
                Console.WriteLine("Attenzione! Si sta cercando di lavorare su un database non connesso!!");
                return false;
            }
        }

        public bool load(string p_strName)
        {
            return doLoad("SELECT * FROM Movimento WHERE M_Nome = '" + p_strName + "'");
        }
        

        public bool load(long p_lID)
        {
            return doLoad("SELECT * FROM Movimento WHERE M_ID = " + p_lID.ToString());
        }

        private bool doLoad(string p_strQuery)
        {
            bool res = false;

            MySql.Data.MySqlClient.MySqlDataReader reader = m_rDB.query(p_strQuery);

            if (reader != null)
            {
                if (reader.HasRows)
                {
                    reader.Read();

                    ID = reader.GetInt64("M_ID");
                    Nome = reader.GetString("M_Nome");
                    Descrizione = reader.GetString("M_Descrizione");
                    DataCreazione = reader.GetString("M_DataCreazione");
                    DataAggiornamento = reader.GetString("M_DataAggiornamento");
                    IDCategoria = reader.GetInt64("M_IDCategoria");
                    IDPersonaggio = reader.GetInt64("M_IDPersonaggio");
                    XML = reader.GetString("M_XML");

                    res = true;
                }
                reader.Close();
            }

            return res;
        }

    }
}
